package org.jeecgframework.boot.springaimcpservice.service.impl;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jeecgframework.boot.springaimcpservice.common.Result;
import org.jeecgframework.boot.springaimcpservice.service.IStatsQueryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class StatsQueryServiceImpl implements IStatsQueryService {
    
    private static final Logger logger = LoggerFactory.getLogger(StatsQueryServiceImpl.class);

    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Autowired
    private ObjectMapper objectMapper;
    
    @Autowired
    private RestTemplate restTemplate;
    
    // DeepSeek配置
    @Value("${spring.ai.deepseek.api-key:sk-82f9a566d0754b97b55086e0f92474fb}")
    private String deepseekApiKey;
    
    @Value("${spring.ai.deepseek.base-url:https://api.deepseek.com/v1}")
    private String deepseekBaseUrl;
    
    @Value("${spring.ai.deepseek.chat.options.model:deepseek-chat}")
    private String deepseekModel;
    
    // OpenAI配置（作为备选）
    @Value("${spring.ai.openai.api-key:}")
    private String openaiApiKey;
    
    @Value("${spring.ai.openai.base-url:https://api.openai.com/v1}")
    private String openaiBaseUrl;
    
    @Value("${spring.ai.openai.chat.options.model:gpt-3.5-turbo}")
    private String openaiModel;

    @Override
    public Result<String> executeStatsQuery(String naturalLanguageQuery) {
        try {
            logger.info("开始处理统计查询请求: {}", naturalLanguageQuery);
            
            // 记录配置信息用于调试
            logger.debug("DeepSeek API Key 配置状态: {}", deepseekApiKey != null && !deepseekApiKey.isEmpty() ? "已配置" : "未配置");
            logger.debug("OpenAI API Key 配置状态: {}", openaiApiKey != null && !openaiApiKey.isEmpty() ? "已配置" : "未配置");
            
            if (deepseekApiKey != null && !deepseekApiKey.isEmpty()) {
                logger.info("检测到DeepSeek API Key，将使用DeepSeek服务");
            } else if (openaiApiKey != null && !openaiApiKey.isEmpty()) {
                logger.info("检测到OpenAI API Key，将使用OpenAI服务");
            } else {
                logger.warn("未检测到任何AI服务的API Key，将使用模拟实现");
            }
            
            // 1. 根据自然语言生成SQL
            String sql = generateSqlFromNaturalLanguage(naturalLanguageQuery);
            logger.info("生成的SQL语句: {}", sql);
            
            // 2. 执行SQL查询
            String queryResult = executeSqlQuery(sql);
            
            // 3. 使用AI分析查询结果
            String analysisResult = analyzeQueryResultWithAI(queryResult, naturalLanguageQuery);
            
            // 返回最终结果
            return Result.ok(analysisResult);
        } catch (Exception e) {
            logger.error("统计查询失败", e);
            return Result.error(500, "查询失败: " + e.getMessage());
        }
    }

    @Override
    public String generateSqlFromNaturalLanguage(String naturalLanguageQuery) {
        // 构建AI提示词
        String prompt = buildSqlGenerationPrompt(naturalLanguageQuery);
        
        // 调用AI生成SQL
        String generatedSql = callAiApi(prompt, "SQL生成");
        
        // 清理AI返回的SQL，移除可能的代码块标记
        generatedSql = cleanSql(generatedSql);
        
        logger.info("AI生成的SQL语句: {}", generatedSql);
        
        return generatedSql;
    }
    
    /**
     * 清理AI返回的SQL语句，移除代码块标记和其他不必要的字符
     * @param sql AI返回的SQL语句
     * @return 清理后的SQL语句
     */
    private String cleanSql(String sql) {
        if (sql == null || sql.isEmpty()) {
            return sql;
        }
        
        // 移除可能的代码块标记
        String cleanedSql = sql.replaceAll("^```sql\\s*", "").replaceAll("\\s*```$", "");
        
        // 移除首尾空白字符
        cleanedSql = cleanedSql.trim();
        
        // 确保SQL语句以分号结束（可选）
        if (!cleanedSql.endsWith(";")) {
            cleanedSql += ";";
        }
        
        return cleanedSql;
    }
    
    /**
     * 构建用于生成SQL的AI提示词
     * @param naturalLanguageQuery 自然语言查询
     * @return 构造的提示词
     */
    private String buildSqlGenerationPrompt(String naturalLanguageQuery) {
        StringBuilder prompt = new StringBuilder();
        prompt.append("你是一个数据库专家，能够根据自然语言生成准确的SQL查询语句。\n");
        prompt.append("数据库中有以下表结构：\n");
        
        // 添加所有表结构
        prompt.append("-- 专家人员表\n");
        prompt.append("drop table if exists ut_expert_person;\n");
        prompt.append("CREATE TABLE `ut_expert_person` (\n");
        prompt.append("                                    `id` int(36) NOT NULL AUTO_INCREMENT COMMENT '主键',\n");
        prompt.append("                                    `create_by` varchar(255) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                    `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                    `update_by` varchar(255) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                    `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                    `sys_org_code` varchar(255) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                    `expert_person_code` varchar(25) DEFAULT NULL COMMENT '专家人员编码',\n");
        prompt.append("                                    `name` varchar(50) DEFAULT NULL COMMENT '专家姓名',\n");
        prompt.append("                                    `id_card` varchar(300) DEFAULT NULL COMMENT '身份证号码',\n");
        prompt.append("                                    `phone_number` varchar(300) DEFAULT NULL COMMENT '手机号',\n");
        prompt.append("                                    `sort_no` int(32) DEFAULT NULL COMMENT '序号',\n");
        prompt.append("                                    `remark` varchar(255) DEFAULT NULL COMMENT '备注',\n");
        prompt.append("                                    `unit_name` varchar(255) DEFAULT NULL COMMENT '单位',\n");
        prompt.append("                                    `contract_start_time` date DEFAULT NULL COMMENT '签约开始时间',\n");
        prompt.append("                                    `contract_end_time` date DEFAULT NULL COMMENT '签约结束时间',\n");
        prompt.append("                                    `role_stat` varchar(25) DEFAULT NULL COMMENT ' 角色分配',\n");
        prompt.append("                                    `role_Id` varchar(36) DEFAULT NULL COMMENT '角色编号',\n");
        prompt.append("                                    `expert_category_id` varchar(255) DEFAULT NULL COMMENT '专家类别id',\n");
        prompt.append("                                    `expert_category_name` varchar(255) DEFAULT NULL COMMENT '专家类别名称',\n");
        prompt.append("                                    `sex` varchar(255) DEFAULT NULL COMMENT '性别',\n");
        prompt.append("                                    `title` varchar(255) DEFAULT NULL COMMENT '职称',\n");
        prompt.append("                                    `position` varchar(255) DEFAULT NULL COMMENT '职务',\n");
        prompt.append("                                    `mail_address` varchar(255) DEFAULT NULL COMMENT '通讯地址',\n");
        prompt.append("                                    `email` varchar(255) DEFAULT NULL COMMENT '电子邮箱',\n");
        prompt.append("                                    `is_effective` varchar(255) DEFAULT NULL COMMENT '退库、身故等不在库内专家，保留其状态设置为”关闭',\n");
        prompt.append("                                    PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB AUTO_INCREMENT=1660953254 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='专家库人员';\n\n");
        
        prompt.append("-- 专家评审表\n");
        prompt.append("drop table if exists ut_expert_review;\n");
        prompt.append("CREATE TABLE `ut_expert_review` (\n");
        prompt.append("                                    `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                    `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                    `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                    `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                    `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                    `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                    `conclusion` varchar(32) DEFAULT NULL COMMENT '专家组结论',\n");
        prompt.append("                                    `total_opinion` varchar(500) DEFAULT NULL COMMENT '总体意见',\n");
        prompt.append("                                    `specific_opinion` varchar(500) DEFAULT NULL COMMENT '具体意见',\n");
        prompt.append("                                    `attachments` varchar(500) DEFAULT NULL COMMENT '评审意见扫描件',\n");
        prompt.append("                                    `report_id` varchar(36) DEFAULT NULL COMMENT '报告编号',\n");
        prompt.append("                                    `supervision_unit` varchar(36) DEFAULT NULL COMMENT '监理单位',\n");
        prompt.append("                                    `project_overview` text COMMENT '工程概况',\n");
        prompt.append("                                    `construction_unit` varchar(36) DEFAULT NULL COMMENT '施工单位',\n");
        prompt.append("                                    `audit_status` varchar(32) DEFAULT NULL COMMENT '审核状态',\n");
        prompt.append("                                    `technical_difficulty` text COMMENT '技术难点',\n");
        prompt.append("                                    `name` varchar(50) DEFAULT NULL COMMENT '工程方案名称',\n");
        prompt.append("                                    `review_type` varchar(32) DEFAULT NULL COMMENT '审核类型',\n");
        prompt.append("                                    `review_date` date DEFAULT NULL COMMENT '审核日期',\n");
        prompt.append("                                    `shield_ids` varchar(500) DEFAULT NULL COMMENT '盾构机编号',\n");
        prompt.append("                                    PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='专家评审主表';\n\n");
        
        prompt.append("-- 专家人员统计信息\n");
        prompt.append("drop table if exists ut_expert_statistics;\n");
        prompt.append("CREATE TABLE `ut_expert_statistics` (\n");
        prompt.append("                                        `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                        `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                        `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                        `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                        `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                        `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                        `doc_id` int(11) DEFAULT NULL COMMENT '报告编号',\n");
        prompt.append("                                        `opinion_management_id` varchar(36) DEFAULT NULL COMMENT '专家意见编号',\n");
        prompt.append("                                        `expert_person_id` varchar(36) DEFAULT NULL COMMENT '专家人员编号',\n");
        prompt.append("                                        PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='专家人员统计信息';\n\n");

        prompt.append("-- 盾构机表\n");
        prompt.append("drop table if exists ut_shield;\n");
        prompt.append("CREATE TABLE `ut_shield` (\n");
        prompt.append("                             `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                             `create_by` varchar(500) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                             `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                             `update_by` varchar(500) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                             `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                             `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                             `brand` varchar(500) DEFAULT NULL COMMENT '品牌',\n");
        prompt.append("                             `shield_type` varchar(50) DEFAULT NULL COMMENT '盾构类型',\n");
        prompt.append("                             `shield_code` varchar(500) DEFAULT NULL COMMENT '盾构编号',\n");
        prompt.append("                             `production_date` date DEFAULT NULL COMMENT '出厂日期',\n");
        prompt.append("                             `order_no` varchar(32) DEFAULT NULL COMMENT '序号',\n");
        prompt.append("                             `status` varchar(32) DEFAULT NULL COMMENT '新/旧',\n");
        prompt.append("                             `sou_shield_id` varchar(36) DEFAULT NULL COMMENT '重造源',\n");
        prompt.append("                             `sou_shield_code` varchar(255) DEFAULT NULL COMMENT '重造源编码',\n");
        prompt.append("                             `knowledge_number` varchar(32) DEFAULT NULL COMMENT '知识库统一编号',\n");
        prompt.append("                             PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机基础表';\n\n");

        prompt.append("-- 盾构机评审台账\n");
        prompt.append("drop table if exists ut_shield_ledger;\n");
        prompt.append("CREATE TABLE `ut_shield_ledger` (\n");
        prompt.append("                                    `id` varchar(36) NOT NULL,\n");
        prompt.append("                                    `shieldcode` varchar(255) DEFAULT NULL COMMENT '盾构编号',\n");
        prompt.append("                                    `brand` varchar(255) DEFAULT NULL COMMENT '品牌',\n");
        prompt.append("                                    `type` varchar(255) DEFAULT NULL COMMENT '类型',\n");
        prompt.append("                                    `proddate` varchar(255) DEFAULT NULL COMMENT '出厂日期',\n");
        prompt.append("                                    `diameter` float DEFAULT NULL COMMENT '直径',\n");
        prompt.append("                                    `contractor` varchar(255) DEFAULT NULL COMMENT '承包商',\n");
        prompt.append("                                    `mileage` float DEFAULT NULL COMMENT '掘进里程',\n");
        prompt.append("                                    `worktime` float DEFAULT NULL COMMENT '主轴工作时间',\n");
        prompt.append("                                    `line` varchar(255) DEFAULT NULL COMMENT '线路',\n");
        prompt.append("                                    `section` varchar(255) DEFAULT NULL COMMENT '区间',\n");
        prompt.append("                                    `exacount` int(11) DEFAULT NULL COMMENT '审查次数',\n");
        prompt.append("                                    `exatime` varchar(255) DEFAULT NULL COMMENT '最近审查日期',\n");
        prompt.append("                                    `expertnames` varchar(255) DEFAULT NULL COMMENT '专家名单',\n");
        prompt.append("                                    PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机评审台账';\n\n");
        
        prompt.append("-- 盾构机履历表\n");
        prompt.append("drop table if exists ut_shield_note;\n");
        prompt.append("CREATE TABLE `ut_shield_note` (\n");
        prompt.append("                                  `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                  `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                  `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                  `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                  `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                  `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                  `brand` varchar(32) DEFAULT NULL COMMENT '品牌',\n");
        prompt.append("                                  `shield_type` varchar(36) DEFAULT NULL COMMENT '盾构类型',\n");
        prompt.append("                                  `shield_code` varchar(32) DEFAULT NULL COMMENT '盾构编号',\n");
        prompt.append("                                  `production_date` date DEFAULT NULL COMMENT '出厂日期',\n");
        prompt.append("                                  `projectid` varchar(32) DEFAULT NULL COMMENT '项目编号',\n");
        prompt.append("                                  `departure_date` date DEFAULT NULL COMMENT '始发日期',\n");
        prompt.append("                                  `arrival_date` date DEFAULT NULL COMMENT '到达日期',\n");
        prompt.append("                                  `geology_remark` varchar(500) DEFAULT NULL COMMENT '主要地质情况简述',\n");
        prompt.append("                                  `dig_mileage` varchar(32) DEFAULT NULL COMMENT '掘进里程',\n");
        prompt.append("                                  `main_worktime` varchar(32) DEFAULT NULL COMMENT '主轴承工作时间',\n");
        prompt.append("                                  `average_monthly` varchar(32) DEFAULT NULL COMMENT '平均月度进尺',\n");
        prompt.append("                                  `shield_id` varchar(36) DEFAULT NULL COMMENT '盾构编号',\n");
        prompt.append("                                  `source` varchar(32) DEFAULT NULL COMMENT '来源',\n");
        prompt.append("                                  `project_name` varchar(255) DEFAULT NULL COMMENT '项目别名',\n");
        prompt.append("                                  PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机履历表';\n\n");
        
        prompt.append("--盾构机履历故障参数表\n");
        prompt.append("CREATE TABLE `ut_shield_note_fault` (\n");
        prompt.append("                                        `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                        `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                        `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                        `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                        `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                        `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                        `month` varchar(36) DEFAULT NULL COMMENT '月份',\n");
        prompt.append("                                        `ring_number` int(11) DEFAULT NULL COMMENT '环号',\n");
        prompt.append("                                        `fault_time` varchar(500) DEFAULT NULL COMMENT '故障时间',\n");
        prompt.append("                                        `fault_reason` varchar(500) DEFAULT NULL COMMENT '故障原因',\n");
        prompt.append("                                        `fault_duration` varchar(100) DEFAULT NULL COMMENT '故障时长',\n");
        prompt.append("                                        `remark` varchar(500) DEFAULT NULL COMMENT '备注',\n");
        prompt.append("                                        `shield_note_id` varchar(36) DEFAULT NULL COMMENT '盾构简历编号',\n");
        prompt.append("                                        PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机履历故障参数表';\n\n");
        
        prompt.append("--盾构机掘进参数\n");
        prompt.append("CREATE TABLE `ut_shield_note_param` (\n");
        prompt.append("                                        `id` varchar(36) NOT NULL,\n");
        prompt.append("                                        `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                        `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                        `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                        `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                        `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                        `month` varchar(32) DEFAULT NULL COMMENT '月份',\n");
        prompt.append("                                        `schedule` varchar(100) DEFAULT NULL COMMENT '进度',\n");
        prompt.append("                                        `formation` varchar(100) DEFAULT NULL COMMENT '地层',\n");
        prompt.append("                                        `advance_rate` varchar(100) DEFAULT NULL COMMENT '掘进速度',\n");
        prompt.append("                                        `thrust` varchar(100) DEFAULT NULL COMMENT '推力',\n");
        prompt.append("                                        `torque` varchar(100) DEFAULT NULL COMMENT '扭矩',\n");
        prompt.append("                                        `shield_note_id` varchar(36) DEFAULT NULL COMMENT '盾构简历编号',\n");
        prompt.append("                                        PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机掘进参数';\n\n");

        prompt.append("--盾构机参数表查询\n");
        prompt.append("CREATE TABLE `ut_shield_parameter` (\n");
        prompt.append("                                       `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                       `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                       `create_time` datetime DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                       `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                       `update_time` datetime DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                       `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                       `main_part_name` varchar(200) DEFAULT NULL COMMENT '主目部件名称',\n");
        prompt.append("                                       `detail_part_name` varchar(200) DEFAULT NULL COMMENT '细目部件名称',\n");
        prompt.append("                                       `parameter` varchar(200) DEFAULT NULL COMMENT '参数配置',\n");
        prompt.append("                                       `remark` varchar(400) DEFAULT NULL COMMENT '备注',\n");
        prompt.append("                                       `single_mode_ls` varchar(10) DEFAULT NULL COMMENT '单模式（泥水）',\n");
        prompt.append("                                       `single_mode_ty` varchar(10) DEFAULT NULL COMMENT '单模式（土压）',\n");
        prompt.append("                                       `dual_mode_ty` varchar(10) DEFAULT NULL COMMENT '双模式（土压/TMB)',\n");
        prompt.append("                                       `dual_mode_ls` varchar(10) DEFAULT NULL COMMENT '双模式（泥水/土压)',\n");
        prompt.append("                                       `three_modes` varchar(500) DEFAULT NULL COMMENT '三模式',\n");
        prompt.append("                                       `shieldid` varchar(36) DEFAULT NULL COMMENT '盾构机编号',\n");
        prompt.append("                                       PRIMARY KEY (`id`) USING BTREE\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构参数表'\n\n");
        
        prompt.append("--盾构机评分信息\n");
        prompt.append("CREATE TABLE `ut_shield_scoring` (\n");
        prompt.append("                                     `id` varchar(36) NOT NULL COMMENT '主键',\n");
        prompt.append("                                     `project_code` varchar(32) DEFAULT NULL COMMENT '项目编号',\n");
        prompt.append("                                     `shield_scoring_item_id` varchar(36) DEFAULT NULL COMMENT '评分项目Id',\n");
        prompt.append("                                     `shield_id` varchar(36) DEFAULT NULL COMMENT '盾构机Id',\n");
        prompt.append("                                     `shield_brand` varchar(100) DEFAULT NULL COMMENT '盾构机品牌',\n");
        prompt.append("                                     `shield_code` varchar(32) DEFAULT NULL COMMENT '盾构机编号',\n");
        prompt.append("                                     `shield_type` varchar(32) DEFAULT NULL COMMENT '盾构机类型',\n");
        prompt.append("                                     `scoring_type` varchar(32) DEFAULT NULL COMMENT '评分类型',\n");
        prompt.append("                                     `weight_score` decimal(5,2) DEFAULT NULL COMMENT '加权得分',\n");
        prompt.append("                                     `content` varchar(2000) DEFAULT NULL COMMENT '评分项目',\n");
        prompt.append("                                     `scoring_item_count` int(255) DEFAULT NULL COMMENT '评分项目数量',\n");
        prompt.append("                                     `scoring_time` date DEFAULT NULL COMMENT '评分日期',\n");
        prompt.append("                                     `is_import` int(255) DEFAULT NULL COMMENT '是否导入',\n");
        prompt.append("                                     `approve_status` int(11) DEFAULT NULL COMMENT '审批状态',\n");
        prompt.append("                                     `remark` varchar(2000) DEFAULT NULL COMMENT '备注',\n");
        prompt.append("                                     `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                     `create_time` date DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                     `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                     `update_time` date DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                     `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                     PRIMARY KEY (`id`) USING BTREE,\n");
        prompt.append("                                     KEY `Reference_64` (`shield_scoring_item_id`) USING BTREE,\n");
        prompt.append("                                     CONSTRAINT `Reference_64` FOREIGN KEY (`shield_scoring_item_id`) REFERENCES `ut_shield_scoring_item` (`id`)\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机评分';\n\n");
        
        prompt.append("--盾构机评分详情\n");
        prompt.append("CREATE TABLE `ut_shield_scoring_detail` (\n");
        prompt.append("                                            `id` varchar(36) NOT NULL,\n");
        prompt.append("                                            `parent_id` varchar(36) DEFAULT NULL COMMENT '评分Id',\n");
        prompt.append("                                            `scoring_item` varchar(255) DEFAULT NULL COMMENT '评分项目',\n");
        prompt.append("                                            `check_type` varchar(100) DEFAULT NULL COMMENT '检验状态',\n");
        prompt.append("                                            `check_item` varchar(200) DEFAULT NULL COMMENT '检查项目',\n");
        prompt.append("                                            `score` int(11) DEFAULT NULL COMMENT '分值',\n");
        prompt.append("                                            `detail_content` varchar(2000) DEFAULT NULL COMMENT '评估标准',\n");
        prompt.append("                                            `end_score` int(255) DEFAULT NULL COMMENT '得分',\n");
        prompt.append("                                            `weight` int(11) DEFAULT NULL COMMENT '权重',\n");
        prompt.append("                                            `order_no` int(11) DEFAULT NULL COMMENT '排序号',\n");
        prompt.append("                                            `create_by` varchar(50) DEFAULT NULL COMMENT '创建人',\n");
        prompt.append("                                            `create_time` date DEFAULT NULL COMMENT '创建日期',\n");
        prompt.append("                                            `update_by` varchar(50) DEFAULT NULL COMMENT '更新人',\n");
        prompt.append("                                            `update_time` date DEFAULT NULL COMMENT '更新日期',\n");
        prompt.append("                                            `sys_org_code` varchar(64) DEFAULT NULL COMMENT '所属部门',\n");
        prompt.append("                                            PRIMARY KEY (`id`) USING BTREE,\n");
        prompt.append("                                            KEY `Reference_65` (`parent_id`) USING BTREE,\n");
        prompt.append("                                            CONSTRAINT `Reference_65` FOREIGN KEY (`parent_id`) REFERENCES `ut_shield_scoring` (`id`)\n");
        prompt.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='盾构机评分详情';\n\n");

        // 添加表关联关系说明
        prompt.append("-- 表关联关系说明:\n");
        prompt.append("-- 1. ut_expert_person (专家人员表) 和 ut_expert_statistics (专家人员统计信息) 通过 expert_person_id 字段关联\n");
        prompt.append("-- 2. ut_shield (盾构机表) 和 ut_shield_ledger (盾构机评审台账) 通过 shield_code 字段关联\n");
        prompt.append("-- 3. ut_shield (盾构机表) 和 ut_shield_note (盾构机履历表) 通过 shield_code 字段关联\n");
        prompt.append("-- 4. ut_shield_note (盾构机履历表) 和 ut_shield_note_fault (盾构机履历故障参数表) 通过 shield_note_id 字段关联\n");
        prompt.append("-- 5. ut_shield_note (盾构机履历表) 和 ut_shield_note_param (盾构机掘进参数) 通过 shield_note_id 字段关联\n");
        prompt.append("-- 6. ut_shield (盾构机表) 和 ut_shield_parameter (盾构参数表) 通过 shieldid 字段关联\n");
        prompt.append("-- 7. ut_shield_scoring (盾构机评分) 和 ut_shield_scoring_detail (盾构机评分详情) 通过 parent_id 字段关联\n");
        prompt.append("-- 8. ut_shield_scoring (盾构机评分) 和 ut_shield (盾构机表) 通过 shield_id 字段关联\n\n");

        prompt.append("请根据以下自然语言查询生成相应的SQL语句：\n");
        prompt.append(naturalLanguageQuery).append("\n");
        prompt.append("只返回SQL语句，不要包含其他解释或说明。");
        
        return prompt.toString();
    }

    @Override
    public String executeSqlQuery(String sql) {
        try {
            logger.info("执行SQL查询: {}", sql);
            
            // 执行SQL查询
            List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql);
            
            // 将结果转换为JSON字符串
            String result = objectMapper.writeValueAsString(resultList);
            logger.info("查询结果条数: {}", resultList.size());
            
            return result;
        } catch (Exception e) {
            logger.error("执行SQL查询失败: {}", sql, e);
            throw new RuntimeException("执行SQL查询失败: " + e.getMessage(), e);
        }
    }

    @Override
    public String analyzeQueryResultWithAI(String queryResult, String originalQuestion) {
        // 构建分析提示词
        String prompt = buildAnalysisPrompt(queryResult, originalQuestion);
        
        // 调用AI分析结果
        String analysisResult = callAiApi(prompt, "结果分析");
        
        return analysisResult;
    }

    /**
     * 构建用于分析结果的AI提示词
     * @param queryResult 查询结果
     * @param originalQuestion 原始问题
     * @return 构造的提示词
     */
    private String buildAnalysisPrompt(String queryResult, String originalQuestion) {
        StringBuilder prompt = new StringBuilder();
        prompt.append("你是一个数据分析专家，能够对数据库查询结果进行深入分析。\n");
        prompt.append("用户的问题是：").append(originalQuestion).append("\n");
        prompt.append("查询结果是：").append(queryResult).append("\n");
        prompt.append("请对查询结果进行分析，并以简洁明了的方式回答用户的问题。");
        
        return prompt.toString();
    }

    /**
     * 调用AI API (优先使用DeepSeek，备选OpenAI)
     * @param prompt 提示词
     * @param purpose 调用目的
     * @return AI生成的内容
     */
    private String callAiApi(String prompt, String purpose) {
        try {
            // 优先使用DeepSeek
            if (deepseekApiKey != null && !deepseekApiKey.isEmpty()) {
                logger.info("使用DeepSeek API进行{}...", purpose);
                return callDeepSeekApi(prompt);
            }
            // 备选使用OpenAI
            else if (openaiApiKey != null && !openaiApiKey.isEmpty()) {
                logger.info("使用OpenAI API进行{}...", purpose);
                return callOpenAiApi(prompt);
            }
            // 如果都没有配置API密钥，使用模拟实现
            else {
                logger.info("使用模拟实现进行{}...", purpose);
                return simulateAiResponse(prompt, purpose);
            }
        } catch (Exception e) {
            logger.error("调用AI API失败，使用模拟实现", e);
            // 如果调用失败，使用模拟实现
            return simulateAiResponse(prompt, purpose);
        }
    }
    
    /**
     * 调用DeepSeek API
     * @param prompt 提示词
     * @return AI生成的内容
     */
    private String callDeepSeekApi(String prompt) {
        try {
            logger.debug("准备调用DeepSeek API，API Key前缀: {}", 
                deepseekApiKey != null && deepseekApiKey.length() > 5 ? 
                deepseekApiKey.substring(0, 5) + "..." : "无效");
            
            // 构建请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setBearerAuth(deepseekApiKey);
            
            // 构建请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", deepseekModel);
            requestBody.put("temperature", 0.7);
            
            Map<String, String> message = new HashMap<>();
            message.put("role", "user");
            message.put("content", prompt);
            
            requestBody.put("messages", new Map[]{message});
            
            HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);
            
            logger.debug("发送请求到DeepSeek API: {}", deepseekBaseUrl + "/chat/completions");
            
            // 发送请求
            String response = restTemplate.postForObject(deepseekBaseUrl + "/chat/completions", request, String.class);
            
            // 解析响应
            JsonNode jsonNode = objectMapper.readTree(response);
            String content = jsonNode.get("choices").get(0).get("message").get("content").asText();
            
            logger.info("DeepSeek API返回结果: {}", content);
            
            return content;
        } catch (Exception e) {
            logger.error("调用DeepSeek API失败", e);
            throw new RuntimeException("调用DeepSeek API失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 调用OpenAI API
     * @param prompt 提示词
     * @return AI生成的内容
     */
    private String callOpenAiApi(String prompt) {
        try {
            logger.debug("准备调用OpenAI API，API Key前缀: {}", 
                openaiApiKey != null && openaiApiKey.length() > 5 ? 
                openaiApiKey.substring(0, 5) + "..." : "无效");
            
            // 构建请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setBearerAuth(openaiApiKey);
            
            // 构建请求体
            Map<String, Object> requestBody = new HashMap<>();
            requestBody.put("model", openaiModel);
            requestBody.put("temperature", 0.7);
            
            Map<String, String> message = new HashMap<>();
            message.put("role", "user");
            message.put("content", prompt);
            
            requestBody.put("messages", new Map[]{message});
            
            HttpEntity<Map<String, Object>> request = new HttpEntity<>(requestBody, headers);
            
            logger.debug("发送请求到OpenAI API: {}", openaiBaseUrl + "/chat/completions");
            
            // 发送请求
            String response = restTemplate.postForObject(openaiBaseUrl + "/chat/completions", request, String.class);
            
            // 解析响应
            JsonNode jsonNode = objectMapper.readTree(response);
            String content = jsonNode.get("choices").get(0).get("message").get("content").asText();
            
            logger.info("OpenAI API返回结果: {}", content);
            
            return content;
        } catch (Exception e) {
            logger.error("调用OpenAI API失败", e);
            throw new RuntimeException("调用OpenAI API失败: " + e.getMessage(), e);
        }
    }
    
    /**
     * 模拟AI响应（当无法调用真实AI服务时使用）
     * @param prompt 提示词
     * @param purpose 调用目的
     * @return 模拟的AI响应
     */
    private String simulateAiResponse(String prompt, String purpose) {
        if ("SQL生成".equals(purpose)) {
            // 模拟SQL生成 - 这里应该根据实际的查询内容来生成，而不是硬编码
            String lowerPrompt = prompt.toLowerCase();
            String sql;
            if (lowerPrompt.contains("专家人数") || lowerPrompt.contains("专家数量")) {
                sql = "SELECT COUNT(*) as total_experts FROM ut_expert_person";
            } else if (lowerPrompt.contains("盾构机") && lowerPrompt.contains("品牌")) {
                sql = "SELECT brand, COUNT(*) as count FROM ut_shield GROUP BY brand";
            } else if (lowerPrompt.contains("单位") && lowerPrompt.contains("专家")) {
                sql = "SELECT unit_name, COUNT(*) as expert_count FROM ut_expert_person GROUP BY unit_name";
            } else {
                sql = "SELECT * FROM ut_expert_person LIMIT 5";
            }
            
            // 确保模拟的SQL也不包含代码块标记
            return sql;
        } else {
            // 模拟结果分析
            return "根据您的查询，系统已成功处理您的请求。查询结果已生成，请查看详细信息。";
        }
    }
}